import allure
from logzero import logger
from Common import BasePage


class Base_index(BasePage):

    @allure.step("{1}")
    def run_method(self, step, method, locator=None, send_values=None):
        """
        方法反射机制，通过此方法找到对应需要执行的方法，is_func_exist(self, method):
        中的self可以修改为其他类，传入哪个类就在哪个类中寻找执行函数
        :param method: 方法名
        :param locator: 需要操作的元素
        :param send_values: 需要传递的值
        :return: 无
        """

        # 判断类中是否有此方法，如果有便执行
        try:
            func = getattr(self, method)
        except ValueError as err:
            logger.error('没找到方法：' + method)
            raise err

        if send_values is None:
            func(locator)
        else:
            func(locator, send_values)

    def action_method(self, steps_list):
        """
        方法反射机制，将操作步骤、页面元素、数据传到此方法，以解析执行
        :param steps_list:
        """
        for steps in steps_list:
            # 在最末尾
            desc = steps[0]
            # 调用的关键字参数
            method = steps[1]
            # 具体方法
            locator = tuple(steps[2])
            # 具体值
            send_values=steps[3]
            # 如果要传递的值有多个，则用列表传递

            if send_values:

                self.run_method(desc, method, locator, send_values)
            # 如果没有要传的值，不传
            else:
                self.run_method(desc, method, locator)

